অ্যাপাচি স্পার্ক (Apache Spark) একটি ডিস্ট্রিবিউটেড ডেটা প্রসেসিং ফ্রেমওয়ার্ক যা দ্রুত ডেটা প্রসেসিংয়ের জন্য in-memory computation ব্যবহার করে। স্পার্কের persist() এবং cache() ফাংশন দুটি ডেটা স্টোরেজ কৌশল যা RDD (Resilient Distributed Dataset) এবং DataFrame এর জন্য ব্যবহৃত হয়। এই দুটি ফাংশন ডেটার ইন-মেমরি স্টোরেজের মাধ্যমে পুনরায় ব্যবহারের জন্য দ্রুত অ্যাক্সেস নিশ্চিত করতে সাহায্য করে, কিন্তু তাদের মধ্যে কিছু মৌলিক পার্থক্যও রয়েছে।
এই টিউটোরিয়ালে আমরা persist() এবং cache() এর মধ্যে পার্থক্য এবং ব্যবহার নিয়ে আলোচনা করব।
1. cache() ফাংশন
cache() স্পার্কের একটি সহজ ফাংশন যা RDD বা DataFrame কে মেমরিতে সংরক্ষণ (in-memory storage) করতে ব্যবহৃত হয়। এটি স্পার্কে ডিফল্ট memory storage level ব্যবহার করে, যা মূলত MEMORY_AND_DISK। যখন আপনি cache() ব্যবহার করেন, স্পার্ক ডেটাকে মেমরিতে রাখে, কিন্তু যদি মেমরি পর্যাপ্ত না থাকে, তাহলে ডিস্কে সেভ করে।
cache() এর ব্যবহার:
cache() সাধারণত তখন ব্যবহার করা হয় যখন আপনি বারবার একই ডেটার সাথে কাজ করতে চান এবং সেই ডেটার দ্রুত অ্যাক্সেস প্রয়োজন।
val rdd = sc.textFile("data.txt")
val cachedRDD = rdd.cache()
// Perform some operations on cachedRDD
val result = cachedRDD.filter(line => line.contains("spark"))
result.collect()
এখানে:
cache()ডেটাকে memory storage level ব্যবহার করে in-memory বা disk এ সঞ্চিত রাখে।
Cache Benefits:
- Faster Access: যখন ডেটা পুনরায় ব্যবহৃত হয়, এটি মেমরি থেকে দ্রুত অ্যাক্সেস করা যায়।
- Ease of Use:
cache()একটি সহজ এবং সরল ফাংশন যা ডেটাকে দ্রুত স্টোরেজে রাখতে সাহায্য করে।
Cache Limitations:
- Default Storage Level: এটি ডিফল্ট MEMORY_AND_DISK ব্যবহার করে, এবং ডেটা যদি মেমরিতে না থাকে, তবে ডিস্কে সেভ হবে। এর ফলে ডিস্ক আই /ও (Input/Output) অপারেশন হতে পারে।
2. persist() ফাংশন
persist() ফাংশনটি cache() এর মতো কাজ করে, তবে এটি ব্যবহারকারীকে storage level কাস্টমাইজ করার সুযোগ প্রদান করে। persist() ব্যবহার করে আপনি ডেটাকে in-memory, disk, off-heap memory, বা অন্যান্য স্টোরেজ লেভেলগুলি নির্ধারণ করতে পারেন, যার মাধ্যমে স্টোরেজ অপ্টিমাইজেশন করা যায়।
persist() এর ব্যবহার:
persist() ব্যবহার করা হয় যখন আপনাকে ডেটার স্টোরেজ লেভেল নির্ধারণ করতে হয় বা আপনি চাইলে মেমরি এবং ডিস্কের মধ্যে একটি নির্দিষ্ট স্টোরেজ স্তরের মধ্যে সিলেক্ট করতে পারেন।
val rdd = sc.textFile("data.txt")
val persistedRDD = rdd.persist(StorageLevel.MEMORY_ONLY)
persistedRDD.collect()
এখানে:
persist()স্পার্কের বিভিন্ন storage levels প্রদান করে, যেমন MEMORY_ONLY, MEMORY_AND_DISK, DISK_ONLY, এবং MEMORY_ONLY_SER।- StorageLevel.MEMORY_ONLY: এটি র্যামেই ডেটা রাখে এবং ডিস্কে সেভ না করার জন্য নির্দেশ দেয়।
persist() Storage Levels:
স্পার্কের persist() কাস্টম স্টোরেজ লেভেল নির্ধারণ করার জন্য কয়েকটি স্টোরেজ লেভেল প্রদান করে:
- MEMORY_ONLY: শুধুমাত্র মেমরিতে ডেটা রাখা হয়, ডিস্কে কিছু সেভ করা হয় না।
- MEMORY_AND_DISK: মেমরি কম হলে, ডেটা ডিস্কেও সেভ হয়।
- DISK_ONLY: শুধুমাত্র ডিস্কে ডেটা রাখা হয়, মেমরিতে কিছু রাখে না।
- MEMORY_ONLY_SER: সিরিয়ালাইজড ফরম্যাটে মেমরিতে ডেটা রাখা হয়, যা কম মেমরি ব্যবহার করে।
- MEMORY_AND_DISK_SER: সিরিয়ালাইজড ফরম্যাটে ডেটা মেমরি এবং ডিস্কে সেভ হয়।
cache() vs persist() এর মধ্যে পার্থক্য
| Feature | cache() | persist() |
|---|---|---|
| Default Storage Level | MEMORY_AND_DISK | Customizable (e.g., MEMORY_ONLY, MEMORY_AND_DISK, etc.) |
| Use Case | Quick caching with default storage level | Custom storage levels, when more control is needed |
| Ease of Use | Simpler to use (default settings) | More flexibility and complexity |
| Storage Level | Only MEMORY_AND_DISK (default) | Multiple options for storage levels |
| Performance | Slightly less flexible in terms of optimization | More optimized as per the selected storage level |
When to Use cache() vs persist()?
- Use
cache()when:- You need a simple way to cache data.
- You are okay with using the default MEMORY_AND_DISK storage level.
- You don’t need fine-grained control over storage.
- Use
persist()when:- You need to control the storage level of the data.
- You want to use a specific storage level (e.g., only in-memory, or only disk-based).
- You are working with large datasets and want to optimize storage.
Conclusion
cache() এবং persist() উভয়ই স্পার্কের RDD বা DataFrame-এর ডেটা ইন-মেমরি এবং ডিস্কে সঞ্চিত রাখার জন্য ব্যবহৃত হয়, তবে persist() আপনাকে storage level কাস্টমাইজ করার সুযোগ দেয়, যেখানে cache() ডিফল্ট MEMORY_AND_DISK স্টোরেজ লেভেল ব্যবহার করে। cache() সাধারণত দ্রুত এবং সহজ ডেটা ক্যাশিংয়ের জন্য ব্যবহৃত হয়, যেখানে persist() বিশেষভাবে কাস্টম স্টোরেজ লেভেল নির্ধারণের জন্য ব্যবহৃত হয়। আপনার কাজের প্রয়োজন অনুসারে আপনি cache() অথবা persist() নির্বাচন করতে পারেন।
Read more